/*	
	window 接受外部的window对象，相对于代理
*/
;(function(window){

	/* 获取节点 */
	var oNode = document.getElementById('node'),//获取手册的包裹容器
		oQuery = document.getElementById('node-query'),//查询表单
		oQueryInput = oQuery.children[0],//查询表单下的输入框
		oQueryLike = oQuery.children[1],//查询表单的模糊搜索
		oMenu = document.getElementById('node-menu'),//手册菜单
		oContnet = document.getElementById('node-content');//手册内容区域

	//遍历dataNode.data并且生产菜单子项与内容子项
	_forEach(function(_item,key){

		//生产新的li节点，并添加。this指向新创建的节点
		oMenu.appendChild(createNode('li',function(){

			//添加一个a标签
			this.innerHTML = '<a href="#/cate-'+_item.cate+'">'+(key+1)+'. '+_item.title+'</a>';
		}));

		//生产div内容节点，并添加。this指向新创建的节点
		oContnet.appendChild(createNode('div',function(){

			this.id = 'content-item-'+_item.cate;
			this.className = 'content-item';
			this.innerHTML = _item.info.join("");
		}));
	},dataNode.data);

	/* 预定义变量 */
	var keyUpTimer;//键盘松开的定时器，避免频繁搜索

	//一个获取焦点事件    一个键盘抬起事件
	oQueryInput.onfocus = oQueryInput.onkeyup = function(){
		
		//取消上回的定时器
		clearTimeout(keyUpTimer);

		//用于检索的字符串,去除前后空格,匹配\替换成\\
		var quertStr = (this.value.replace(/\s*|\s*$/g,'')).replace(/\\/,'\\\\');

		//300毫秒后开始查询
		keyUpTimer = setTimeout(function(){

			//检索
			if(quertStr != ''){

				/* 生产检索到的节点 */
				var likeDom = [];
				//循环添加到oQueryLike标签
				_forEach(function(_item){

					likeDom.push('<li><a href="#/cate-'+_item.data.cate+'">'+_item.data.title+'</a></li>')
				},searchStr(quertStr));

				//添加到oQueryLike
				oQueryLike.innerHTML = likeDom.join('');

				//绑定一个点击销毁事件
				oNode.onclick = function(){

					oQueryLike.innerHTML = '';
					oNode.onclick=null;
				};
			}
		},300);		
	};

	//监听url地址发送改变触发
	window.onhashchange = urlChangeHash;
	//默认先执行一次，页面刷新时也要监听
	urlChangeHash();
	/* 处理url的hash值改变 */
	function urlChangeHash(){

		//使用正则匹配cate的值
		var _hash = window.location.hash.match(/[^(#\/w?cate\b)]\w*/)[0];

		oContnet.parentElement.scrollTop = getOffset(document.getElementById('content-item'+_hash)).top;
	}
})(window);

/*
	字符检索查询
		str 需要查询的字符串
		maxN 检索数组的长度 默认返回 5 条数据
*/
function searchStr(str,maxN){
	
	//设置默认值
	maxN = maxN || 5;

	//保存检索到数据
	var likeArr = [];

	//检索的正则
	var reg = new RegExp('[^<]'+str+'(?!>)','igm');

	//遍历dataNode.data数据进行检索
	_forEach(function(_item,key){

		var titleQ = _item.title.match(reg) || [],//查询标题 标题 100
			typeQ = _item.type.match(reg) || [],//查询类型 类型 10
			infoQ = _item.info.join('').match(reg) || [];//查询内容 类型 1

		//类型与内容满足其中一个条件，便加入检索数组中
		if(typeQ.length || infoQ.length ){

			likeArr.push({
				data : _item,
				like : titleQ.length * 100 + typeQ.length * 10 + infoQ.length//计算权重
			});
		}
	},dataNode.data);

	//权重由大至小的排序
	likeArr.sort(function(a,b){

		return b.like - a.like;
	});

	//返回检索到的数据
	return likeArr.splice(0, maxN);
}

/*
	生产节点处理方法
		nodeName 节点名称
		callback 处理函数
*/
function createNode(nodeName,callback){

	//生产节点
	var thatNode = document.createElement(nodeName);

	//处理函数存在才执行，处理函数没有把节点重新返回出来，默认返回生产的节点
	return (callback && callback.call(thatNode,thatNode)) || thatNode;
}

/* 
	遍历方法
		callback 处理函数
		arr 需要处理的数组
		order 顺序
			false 正序 递增
			true 倒序 递减
*/
function _forEach(callback,arr,order){

	/* 定义循环需要的变量 默认正序*/
	var i = 0,
		iL = arr.length - 1;

	//是否需要倒序 交换值
	if(order){

		i+=iL;
		iL = i - iL;
		i = i - iL;
	};

	//当数组存在并且长度不为0时遍历
	if(arr && arr.length){

		for( ; order ? i >= 0 : i <= iL;){

			//当函数存在时执行
			callback && callback(arr[i],i,arr);

			//倒序递减 正序递增
			order ? i-- : i++;
		}
	}
}

/*
	获取元素距离顶部的位置
		ele 元素节点
*/
function getOffset(ele) {
	
	var _statu = true;
		offset = {
			left : 0,
			top : 0
		};

	while (ele) {
		
		offset.left += ele.offsetLeft;
		offset.top += ele.offsetTop
		if(_statu){

			_statu = false;
		}else{

			offset.left += ele.clientLeft;
			offset.top += ele.clientTop;
		}

		ele = ele.offsetParent;
	}
	
	return offset;
}